/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;

import java.util.List;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.*;

import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.csvreader.CsvReader;
import java.nio.charset.Charset;
import java.sql.DriverManager;
import javax.servlet.ServletConfig;
import utils.CargarConfiguraciones;
import utils.respuestaServlet;


/**
 *
 * @author Eduardo Cerritos
 */
public class cargarAlumnos extends HttpServlet {
   
    private CsvReader reader;
    private Connection conexion;
    private Statement instruccion;

    //Establecer la conexion con la base de datos
    @Override
    public void init (ServletConfig config) throws ServletException{

    //Intentar la conexion y crear instrucciones
        try{
        CargarConfiguraciones cc = new CargarConfiguraciones();
        Class.forName(cc.getValor("driver"));
        conexion =  DriverManager.getConnection(cc.getValor("urlbase"),
                    cc.getValor("usuario"),
                    cc.getValor("clave"));
        //Crear la instruccion
        instruccion = conexion.createStatement();
        }catch(Exception e){
            e.printStackTrace();
        }//end catch


    }
    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        // obtener el directorio donde guardar temporalmente los archivos
        //dirUploadFiles = getServletContext().getRealPath( getServletContext().getInitParameter( "dirUploadFiles" ) );

        if( ServletFileUpload.isMultipartContent( request ) ){

         // crear el arhivo factory
          FileItemFactory factory = new DiskFileItemFactory();


         // crear el servlet upload
         ServletFileUpload upload = new ServletFileUpload( factory );

         // establecer un tamaÃ±o maximo del archivo
         //upload.setSizeMax( );

         String materia ="";
         List listUploadFiles = null;
         FileItem item = null;
         FileItem file = null;

             try{
                 // adquirir la lista de FileItem asociados a la peticion
                 listUploadFiles = upload.parseRequest(request);

                 // Iterar para obtener todos los FileItem
                 Iterator it = listUploadFiles.iterator();
                 while( it.hasNext() ){
                     item = ( FileItem ) it.next();
                     // evaluar si el campo es de tipo file, para subir al servidor
                     if( !item.isFormField() ) //si es el archivo subido
                         file = item;
                     else{
                         String campo = item.getFieldName();
                         if(campo.equals("materia")){
                             materia = item.getString();
                         }
                     }
                 }
                 // una vez obtenido el archivo proceder a guardar las materias
                 // verificamos si el archivo es > 0
                 if( file.getSize() > 0 ){
                     // obtener el nombre, tipo y extension del archivo
                     String nombre   = file.getName();
                     String tipo     = file.getContentType();
                     String extension = nombre.substring( nombre.lastIndexOf( "." ) );
                     // si es un csv valido
                     if(tipo.compareTo("text/csv")== 0 || extension.compareToIgnoreCase(".csv") == 0)
                     {
            //                     // Crear el archivo temporalmente
            //                     File archivo = new File( dirUploadFiles, nombre );
            //                     item.write( archivo );
            //                     // si se guardo recorrerlo para enviar los correos
            //                     if ( archivo.exists() )
            //                     {
            //                        out.println( "GUARDADO " + archivo.getAbsolutePath() + "</p>");
            //                        reader = new CsvReader(archivo.getAbsolutePath());

                        reader = new CsvReader(file.getInputStream(), Charset.defaultCharset());

                        //recorrer el archivo
                        while (reader.readRecord())
                        {
                            String carnet = reader.get(0);
                            String nombre_alumno = reader.get(1);

                            String sql = "SELECT * FROM alumno WHERE carnet = '" + carnet + "'";
                            System.out.println(sql);
                            ResultSet alumnoRS = instruccion.executeQuery(sql);
                            if(!alumnoRS.next()) //sino existe en el sistema, registrarlo
                            {
                                sql = "INSERT INTO alumno(carnet, nombre) VALUES('" + carnet + "', '"+nombre_alumno+"')";
                                System.out.println(sql);
                                instruccion.executeUpdate(sql);
                                // inscribirlo en la materia
                                sql = "INSERT INTO alumno_materia(carnet, codmateria) VALUES('"+carnet+"','"+materia+"')";
                                System.out.println(sql);
                                instruccion.executeUpdate(sql);
                            }else{
                                sql = "SELECT * FROM alumno_materia WHERE carnet = '" + carnet + "' and codmateria = '"+materia+"'";
                                System.out.println(sql);
                                alumnoRS = instruccion.executeQuery(sql);
                                if(!alumnoRS.next()) //sino esta inscrito en la materia, inscribirlo
                                {
                                    sql = "INSERT INTO alumno_materia(carnet, codmateria) VALUES('"+carnet+"','"+materia+"')";
                                    System.out.println(sql);
                                    instruccion.executeUpdate(sql);
                                }
                            }
                        }
                        respuestaServlet.imprimirEncabezado(out, "Cargar Alumnos");
                        out.println("Alumnos ingresados exitosamente");
                        respuestaServlet.imprimirPie(out);

                        reader.close();
            //                     }else{
            //                         // nunca se llega a ejecutar
            //                         out.println( "FALLO AL GUARDAR. NO EXISTE " + archivo.getAbsolutePath() + "</p>");
            //                     }
                     }
                     else
                        out.println("No introdujo un tipo de archivo CSV valido!");
                    }
             }catch( FileUploadException e ){
                 e.printStackTrace();
                 respuestaServlet.imprimirEncabezado(out, "Cargar Alumnos");
                 out.println("Ocurrio un error al cargar su archivo CSV!");
                 respuestaServlet.imprimirPie(out);
             }catch (Exception e){
                 // si existe alguna problema
                 respuestaServlet.imprimirEncabezado(out, "Cargar Alumnos");
                 out.println("No se pudieron ingresar los alumnos");
                 respuestaServlet.imprimirPie(out);
                 e.printStackTrace();
             }
        }
        out.close();
}

     @Override
    public void destroy()
    {

        try{
            instruccion.close();
            conexion.close();

        }
        catch(SQLException exc)
        {
            exc.printStackTrace();
        }

    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
